﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Entity;
using System.Data;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data.SqlTypes;

namespace DAL
{
    public class CidadeWrapper : BaseWrapper, IWrapper<Cidade>
    {
        public List<Cidade> GetAll()
        {
            List<Cidade> LISTA = new List<Cidade>();

            SqlConnection cn = new SqlConnection(ConnectionString());
            SqlCommand cmd = new SqlCommand("SP_CIDADE_GETALL", cn);
            cmd.CommandType = CommandType.StoredProcedure;



            try
            {
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    Cidade Cidade = new Cidade();
                    Cidade.IDESTADO = int.Parse(dr["IDESTADO"].ToString());
                    Cidade.IDCIDADE = int.Parse(dr["IDCIDADE"].ToString());
                    Cidade.NOME = dr["NOME"].ToString();

                    LISTA.Add(Cidade);
                }
            }
            catch (SqlException ex)
            {
                Messages += "Erro na inserção de dados\n";
                Messages += ex.Message.ToString();
                Logs.MENSAGEM = Messages;
                Logs.TIPOLOG = "Leitura de dados";
                LOGsWrapper LogsWrapper = new LOGsWrapper();
                LogsWrapper.Insert(Logs);
            }
            finally
            {
                ;
                cn.Close();
            }
            return LISTA;
        }

        public Cidade GetById(int id)
        {
            Cidade Cidade = new Cidade();

            SqlConnection cn = new SqlConnection(ConnectionString());
            SqlCommand cmd = new SqlCommand("SP_CIDADE_GETALL", cn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@IDCIDADE", id);



            try
            {
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {

                    Cidade.IDESTADO = int.Parse(dr["IDESTADO"].ToString());
                    Cidade.IDCIDADE = int.Parse(dr["IDCIDADE"].ToString());
                    Cidade.NOME = dr["NOME"].ToString();

                }
            }
            catch (SqlException ex)
            {
                Messages += "Erro na inserção de dados\n";
                Messages += ex.Message.ToString();
                Logs.MENSAGEM = Messages;
                Logs.TIPOLOG = "Leitura de dados";
                LOGsWrapper LogsWrapper = new LOGsWrapper();
                LogsWrapper.Insert(Logs);
            }
            finally
            {
                ;
                cn.Close();
            }
            return Cidade;
        }

        public bool Insert(Cidade entity)
        {
            bool status = false;
            SqlConnection cn = new SqlConnection(ConnectionString());
            SqlCommand cmd = new SqlCommand("SP_CIDADE_INSERT", cn);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;

            SqlParameter parametro = new SqlParameter("@IDCIDADE", DbType.UInt32);
            parametro.Direction = ParameterDirection.Output;

            cmd.Parameters.Add(parametro);


            cmd.Parameters.AddWithValue("@IDESTADO", entity.IDESTADO);
            cmd.Parameters.AddWithValue("@NOME", entity.NOME);

            try
            {
                cn.Open();
                cmd.ExecuteNonQuery();
                entity.IDCIDADE = int.Parse(cmd.Parameters[0].Value.ToString());
                status = true;
            }
            catch (SqlException ex)
            {
                Messages += "Erro na inserção de dados\n";
                Messages += ex.Message.ToString();

            }
            finally
            {
                if (cn.State != ConnectionState.Closed)
                    cn.Close();
            }

            return status;

        }

        public bool Update(Cidade entity)
        {
            bool status = false;
            SqlConnection cn = new SqlConnection(ConnectionString());
            SqlCommand cmd = new SqlCommand("SP_CIDADE_UPDATE", cn);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@IDESTADO", entity.IDESTADO);
            cmd.Parameters.AddWithValue("@IDCIDADE", entity.IDCIDADE);
            cmd.Parameters.AddWithValue("@NOME", entity.NOME);

            try
            {
                cn.Open();
                cmd.ExecuteNonQuery();
                status = true;
            }
            catch (SqlException ex)
            {
                Messages += "Erro na inserção de dados\n";
                Messages += ex.Message.ToString();
                Logs.MENSAGEM = Messages;
                Logs.TIPOLOG = "Manipulação de dados";
                LOGsWrapper LogsWrapper = new LOGsWrapper();
                LogsWrapper.Insert(Logs);
            }
            finally
            {
                if (cn.State != ConnectionState.Closed)
                    cn.Close();
            }

            return status;
        }

        public bool Delete(Cidade entity)
        {
            bool status = false;
            SqlConnection cn = new SqlConnection(ConnectionString());
            SqlCommand cmd = new SqlCommand("SP_CIDADE_DELETE", cn);
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@IDCIDADE", entity.IDCIDADE);

            try
            {
                cn.Open();
                cmd.ExecuteNonQuery();
                status = true;
            }
            catch (SqlException ex)
            {
                Messages += "Erro na exclusão dos dados\n";
                Messages += ex.Message.ToString();
                Logs.MENSAGEM = Messages;
                Logs.TIPOLOG = "Manipulação de dados";
                LOGsWrapper LogsWrapper = new LOGsWrapper();
                LogsWrapper.Insert(Logs);
            }
            finally
            {
                if (cn.State != ConnectionState.Closed)
                    cn.Close();
            }

            return status;
        }

        public Cidade GetByIdEndereco(int id)
        {
            Cidade Cidade = new Cidade();

            SqlConnection cn = new SqlConnection(ConnectionString());
            SqlCommand cmd = new SqlCommand("SP_CIDADE_GETBYENDERECO", cn);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@IDENDERECO", id);



            try
            {
                cn.Open();
                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {

                    Cidade.IDESTADO = int.Parse(dr["IDESTADO"].ToString());
                    Cidade.IDCIDADE = int.Parse(dr["IDCIDADE"].ToString());
                    Cidade.NOME = dr["NOME"].ToString();

                }

            }
            catch (SqlException ex)
            {
                Messages += "Erro na inserção de dados\n";
                Messages += ex.Message.ToString();
                Logs.MENSAGEM = Messages;
                Logs.TIPOLOG = "Manipulação de dados";
                LOGsWrapper LogsWrapper = new LOGsWrapper();
                LogsWrapper.Insert(Logs);
            }
            finally
            {
                ;
                cn.Close();
            }
            return Cidade;
        }

    }
}